package com.benchmark;

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@BenchmarkMode(Mode.All)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Thread)
public class Main {

  private long fibon(long n) {
    if (n <= 2) {
      return 1;
    }
    return fibon(n - 1) + fibon(n - 2);
  }

  @Benchmark
  public void testFibon1() {
    fibon(1);

  }

  @Benchmark
  public void testFibon10() {
    fibon(10);

  }

  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder().include(Main.class.getSimpleName()) // benchmark
        // 所在的类的名字，注意这里是使用正则表达式对所有类进行匹配的
        .forks(1) // 进行 fork 的次数。如果 fork 数是2的话，则 JMH 会 fork 出两个进程来进行测试
        .warmupIterations(1) // 预热的迭代次数
        .measurementIterations(1) // 实际测量的迭代次数
        .build();

    new Runner(opt).run();
  }
}
